package frsf.cidisi.exercise.laberinto.search.util;

import java.util.ArrayList;
import java.util.Arrays;

public class Entorno {
    private ArrayList<Par> entradas;
    private ArrayList<Par> salidas;
    private ArrayList<Par> llaves;
    private ArrayList<Par> cerrojos;
    private Celda[][] laberinto;
    
    public Entorno(int f, int c) {
    	this.entradas = new ArrayList<Par>();
    	this.salidas = new ArrayList<Par>();
    	this.llaves = new ArrayList<Par>();
    	this.cerrojos = new ArrayList<Par>();
    	this.laberinto = new Celda[f][c];    	
    }
    
    public Entorno(ArrayList<Par> entradas, ArrayList<Par> salidas, ArrayList<Par> llaves, 
    		       ArrayList<Par> cerrojos, Celda[][] laberinto) {
		this.entradas = entradas;
		this.salidas = salidas;
		this.llaves = llaves;
		this.cerrojos = cerrojos;
		this.laberinto = laberinto;
	}

	public ArrayList<Par> getEntradas() {
		return entradas;
	}

	public void setEntradas(ArrayList<Par> entradas) {
		this.entradas = entradas;
	}

	public ArrayList<Par> getSalidas() {
		return salidas;
	}

	public void setSalidas(ArrayList<Par> salidas) {
		this.salidas = salidas;
	}
	
	public ArrayList<Par> getLlaves() {
		return llaves;
	}

	public void setLlaves(ArrayList<Par> llaves) {
		this.llaves = llaves;
	}

	public ArrayList<Par> getCerrojos() {
		return cerrojos;
	}

	public void setCerrojos(ArrayList<Par> cerrojos) {
		this.cerrojos = cerrojos;
	}

	public Celda[][] getLaberinto() {
		return laberinto;
	}

	public void setLaberinto(Celda[][] laberinto) {
		this.laberinto = laberinto;
	}
	
	public void setCelda(Celda unaCelda, int x, int y) {
		laberinto[x][y] = unaCelda;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Entorno other = (Entorno) obj;
		if (cerrojos == null) {
			if (other.cerrojos != null)
				return false;
		} else if (!cerrojos.equals(other.cerrojos))
			return false;
		if (entradas == null) {
			if (other.entradas != null)
				return false;
		} else if (!entradas.equals(other.entradas))
			return false;
		if (!Arrays.equals(laberinto, other.laberinto))
			return false;
		if (llaves == null) {
			if (other.llaves != null)
				return false;
		} else if (!llaves.equals(other.llaves))
			return false;
		if (salidas == null) {
			if (other.salidas != null)
				return false;
		} else if (!salidas.equals(other.salidas))
			return false;
		return true;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Object clone() {		
		return new Entorno((ArrayList<Par>) entradas.clone(),
				           (ArrayList<Par>) salidas.clone(),
				           (ArrayList<Par>) llaves.clone(),
				           (ArrayList<Par>) cerrojos.clone(), laberinto.clone());
	}    
    
	@Override
	public String toString() {
		return "Entorno []";
	}	
}
